package com.cskaoyan.javase.oop3._2inner._3local._1basic;

/**
 * 在研究具体的访问特点之前，还是要明确两点：
 * 以类中方法的局部内部类为例
 *      1.局部内部类仍然可以无条件的访问外围类的成员，但是外围类想要访问局部内部类成员时，情况发生了变化。
 *      由于局部内部类仅在方法内部生效，所以在外围类当中，仅那个装有局部内部类的方法可以访问局部内部类成员（不受访问权限限制）。
 *
 *      2.类中的方法有两种：
 *          a.成员方法中的局部内部类：
 *              创建局部内部类对象，会持有外围类对象的引用（和成员内部类对象相似）
 *              问：如何创建局部内部类对象？位置在哪里？语法怎么写？
 *                  在方法中，直接创建局部内部类对象即可。
 *                  在方法外部无法创建。
 *
 *          b.静态成员方法中的局部内部类：
 *              创建局部内部类对象，不会持有外围类对象的引用（和成员内部类对象不一致的地方）
 *              问：如何创建局部内部类对象？位置在哪里？语法怎么写？
 *                  在方法中，直接创建局部内部类对象即可。
 *                  在方法外部无法创建。
 *
 *      以上，外围类的成员方法中局部内部类对象和静态方法中的局部内部类对象是不同的
 *          成员方法中，局部内部类对象会持有外围类对象的引用
 *          静态方法中，局部内部类对象不会持有外围类对象的引用
 *
 *
 * 局部内部类的访问特点，我们仍然主要从以下几个角度研究：
 * 1. 局部内部类内部访问外围类
 *      可以访问，不受权限限制。
 * 2. 外围类访问局部内部类成员
 *      也可以访问，但是有限制
 *      仅在装有局部内部类的方法中，能够访问
 *      不受访问权限限制
 *
 * 3. 外部类访问局部内部类成员
 *      不可能访问到
 *
 * 4. 局部内部类访问外部类成员
 *      可以，但是要受访问权限限制
 *
 *
 * 接下来分别研究，外围类的成员方法和静态方法中局部内部类：
 *      1.成员方法中的局部内部类
 *          可以直接访问外围类成员，因为已经持有外围类的对象。
 *          同名了怎么办？
 *          this指向当前对象（自己）
 *          外围类类名.this指向外围类对象
 *  成员方法中的局部内部类和成员内部类相似。
 *
 *      2.静态方法中的局部内部类
 *          不能直接访问外围类成员，因为没有持有外围类的对象。
 *          需要创建外围类对象。
 *
 *
 * @since 14:41
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

class EnclosedClazz {
    int a;
    private int b = 10;
    static int c = 20;
    static final int D = 30;

    public void test() {
        class Inner {
            int a;
            public void testInner(int a) {
                // 访问外围类成员
                System.out.println(a);
                System.out.println(this.a);
                System.out.println(EnclosedClazz.this.a);
                System.out.println(b);
                System.out.println(EnclosedClazz.c);
                System.out.println(EnclosedClazz.D);
            }
        }
        Inner i = new Inner();
        System.out.println(i.a);
        System.out.println(a);
    }

    public static void testStatic() {
        class Inner {
            int a;
            public void testInner(int a) {
                // 访问外围类成员
                System.out.println(a);
                System.out.println(this.a);
                // System.out.println(EnclosedClazz.this);
                EnclosedClazz ec = new EnclosedClazz();
                System.out.println(ec.a);
                System.out.println(ec.b);
            }
        }
        Inner i = new Inner();
        System.out.println(i.a);
    }
}
